package com.wang.tool.monitor.ops;

import com.wang.tool.monitor.core.LinkInfo;
import com.wang.tool.monitor.core.MonitorInfo;
import com.wang.tool.monitor.fastover.FastoverInfo;

/**
 * 监控控制台
 * 除了source,其他配置均可为空
 * 适用于不好写死,需要动态改变的一些配置
 *
 * @author shaopeng
 * @date 2022/10/15
 * @see MonitorInfo#MonitorInfo
 */
public interface MonitorOps {

    /**
     * 源 非空
     * 变更时根据source.equals判断是否有更新,防止多次调用产生无意义刷新
     */
    Object getSource();

    /**
     * 生效开始时间,null不限制
     *
     * @return
     */
    Long getBeginTime();

    /**
     * 生效结束时间,null不限制
     *
     * @return
     */
    Long getEndTime();

    /**
     * 快速返回
     * 快速结束判定器
     * eg: 降级,下线,模拟场景
     * 1.正常执行业务逻辑返回null
     * 2.返回FastoverInfo对象,自行抛异常/返回目标对象
     *
     * @param time   时间戳,时间范围判断
     * @param params 参数,参数取值白名单判断
     * @return
     */
    FastoverInfo fastover(long time, Object[] params);

    /**
     * debug判定器
     * eg: 动态debug
     * 调试可用
     * @param opsContext 非空
     * 注意开启范围及性能
     */
    boolean isDebug(OpsContext opsContext);

    /**
     * 慢调用阈值
     * 建议不要太严苛
     * @param params 非空
     * @see MonitorInfo#slowTime
     */
    Integer fetchSlowTime(Object[] params);

    /**
     * 超时阈值
     * 一般在给上游接入层接口设置,我们不知道上游给我们的时间
     * 依据上游配置
     * @param params 非空
     * @see MonitorInfo#outTime
     */
    Integer fetchOutTime(Object[] params);

    /**
     * 附件提取器
     * 返回值会写入详情
     * debug状态下结果也会写入链路ext中
     * 注意开启范围及性能
     * @param opsContext 非空
     * @see MonitorInfo#details
     * @see LinkInfo#ext
     * @see MonitorInfo#stepOutMonitor
     */
    Object fetchDetail(OpsContext opsContext);

}
